import { utils, writeFileXLSX } from 'xlsx';

interface Options<T> {
  arr: T[];
  header: Record<string, string>;
  fileName: string;
}

/**
 *
 * @param options 配置项，必须包含 arr、header、fileName
 * @attribute arr 需要导出excel的 json 数据
 * @attribute header json 数据的 key 转为 excel 表头
 * @attribute fileName 导出后的文件名
 */
const jsonToExcel = <T>(options: Options<T>) => {
  // 创建工作簿
  const workBook = utils.book_new();
  // 处理表头，把 json 数据的字段对应转成 excel 显示的表头
  const newArr = options.arr.map((item) => {
    let obj: Record<string, keyof T> = {};
    for (let key in item) {
      if (options.header[key]) obj[options.header[key]] = item[key] as unknown as keyof T;
      else obj[key] = item[key] as unknown as keyof T;
    }
    return obj;
  });
  // 创建工作表
  const workSheet = utils.json_to_sheet(newArr);
  utils.book_append_sheet(workBook, workSheet);
  writeFileXLSX(workBook, `${options.fileName}.xlsx`, { bookType: 'xlsx' });
};

export default jsonToExcel;
